// pages/address/add/add.js
import QQMapWX from '../../../libs/qqmap-wx-jssdk.min'
// 1️⃣ 引入 async-validator，async-validator 提供了一个构造函数
import Schema from 'async-validator'
import {
  reqAddAddress,
  reqAddressDetails,
  reqEditAddress
} from '../../../api/address'
import {
  toast
} from '../../../../../utils/extendApi.js'
Page({
  /**
   * 页面的初始数据
   */
  data: {
    // 需要将请求参数放到 data 对象下，方便在模板中绑定数据
    name: '', // 收货人
    phone: '', // 手机号码
    provinceName: '', // 省
    provinceCode: '', // 省编码
    cityName: '', // 市
    cityCode: '', // 市编码
    districtName: '', // 区
    districtCode: '', // 市编码
    address: '', // 详细地址
    fullAddress: '', // 完整地址
    isDefault: false // 是否设置为默认地址，0 不设置为默认地址，1 设置为默认地址
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    // 实例化API核心类
    this.qqmapsdk = new QQMapWX({
      key: 'CIKBZ-SJQOT-IYRX4-VGFUW-EUZZV-NFFHI'
    })
    if(options.id && options.id != 'null'){
      this.getDetails(options.id)
    }
  },
  //获取地址详情
  async getDetails(id){
    const res = await reqAddressDetails(id)
    this.setData(res.data)
  },
  onAddressChange(e) {
    const [provinceCode, cityCode, districtCode] = e.detail.code
    const [provinceName, cityName, districtName] = e.detail.value

    // 存储省市区对应的编码
    this.setData({
      provinceCode,
      provinceName,
      cityCode,
      cityName,
      districtName,
      districtCode
    })
  },
  async onLocation() {
    //     // 获取 纬度 、精度
    // const { latitude, longitude } = await wx.getLocation()
    // 打开地图选择位置，获取 纬度 、精度
    let {
      longitude,
      latitude,
      name
    } = await wx.chooseLocation()

    // 使用 reverseGeocoder 方法进行逆地址解析
    this.qqmapsdk.reverseGeocoder({
      // 传入经、纬度
      location: {
        longitude,
        latitude
      },

      // 逆地址解析成功后执行
      success: (res) => {
        // province 省  city 市  district 区
        const {
          province, // 省
          city, // 市
          district, // 区
          adcode // 行政区划代码
        } = res.result.ad_info

        // 获取街道 + 门牌，街道门牌 可能为空
        const {
          street,
          street_number
        } = res.result.address_component

        // 标准地址
        const {
          standard_address
        } = res.result.formatted_addresses

        this.setData({
          // 省级: 前两位有值，后4位置0，如，河北省: 130000
          provinceCode: adcode.replace(adcode.substring(2, 6), '0000'),
          provinceName: province,

          // 市前面多个国家代码，需要进行截取
          cityCode: adcode.replace(adcode.substring(4, 6), '00'),
          cityName: city,

          // 东莞市、中山市、修州市、嘉关市 因其下无区县级，
          districtCode: district && adcode,
          districtName: district,

          // 详细地址
          address: street + street_number + name,
          fullAddress: standard_address + name
        })
      }
    })
  },
  async saveAddrssForm() {
    // 解构出省市区以及 是否是默认地址
    const {
      provinceName,
      cityName,
      districtName,
      address,
      isDefault
    } = this.data
    // 拼接完整的地址
    const fullAddress = provinceName + cityName + districtName + address
    // 合并接口请求参数
    const params = {
      ...this.data,
      fullAddress,
      isDefault: isDefault ? 1 : 0
    }
    //对参数进行验证
    const {valid} = await this.validatorAddress(params)
    // 如果valid等于false，说明验证失败，就不执行后续的逻辑
    if(!valid) return
    //如果valid等于true，说明验证成功
    const res = await (params.id && params.id != 'null') ? reqEditAddress(params.id,params) :  reqAddAddress(params)
    wx.navigateBack({
      success:()=>{
        toast({title: (params.id && params.id != 'null') ? '编辑成功' : '新增成功'})
      }
    })
  },
  //对新增收获地址请求参数进行验证
   validatorAddress(params) {
    // 验证收货人，是否只包含大小写字母、数字和中文字符
    const nameRegExp = '^[a-zA-Z\\d\\u4e00-\\u9fa5]+$'

    // 验证手机号，是否符合中国大陆手机号码的格式
    const phoneReg = '^1(?:3\\d|4[4-9]|5[0-35-9]|6[67]|7[0-8]|8\\d|9\\d)\\d{8}$'

    // 创建验证规则
    const rules = {
      name: [
        { required: true, message: '请输入收货人姓名' },
        { pattern: nameRegExp, message: '收货人姓名不合法' }
      ],
      phone: [
        { required: true, message: '请输入收货人手机号' },
        { pattern: phoneReg, message: '收货人手机号不合法' }
      ],
      provinceName: { required: true, message: '请选择收货人所在地区' },
      address: { required: true, message: '请输入详细地址' }
    }

    // 传入验证规则进行实例化
    const validator = new Schema(rules)

    // 调用实例方法对请求参数进行验证
    // 注意：我们希望将验证结果通过 Promise 的形式返回给函数的调用者
    return new Promise((resolve) => {
      validator.validate(params, (errors) => {
        if (errors) {
          // 如果验证失败，需要给用户进行提示
          toast({ title: errors[0].message })
          // 如果属性值是 false，说明验证失败
          resolve({ valid: false })
        } else {
          // 如果属性值是 true，说明验证成功
          resolve({ valid: true })
        }
      })
    })
  },
})